#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sys/stat.h>
#include <unistd.h>
#include "../source/server.hpp"

//字符串分割函数
size_t Split(const std::string &src,const std::string &sep,std::vector<std::string> *arry){
    size_t offset=0;
    //abc,bcd,def,
    //有10个字符，offset是查找的起始位置，范围应该是0~9,offset==10就代表已经越界了
    while(offset < src.size()){
        size_t pos=src.find(sep,offset);//在src字符串偏移量offset处，开始向后查找sep字符/子串，返回查找到的位置
        if(pos == std::string::npos){//没有找到特定的字符
            //将剩余的部分当成一个子串，放入arry中
            if(pos == src.size()) break;
            arry->push_back(src.substr(offset));
            return arry->size();
        }
        if(pos == offset) {
            offset=pos+sep.size();
            continue;//当前子串是一个空的，没有内容
        }
        arry->push_back(src.substr(offset,pos-offset));
        offset=pos+sep.size();
    }
    return arry->size();
}

//读取文件的所有内容，将读取的内容放到一个Buffer中
static bool ReadFile(const std::string &filename,std::string *buf){
    std::ifstream ifs(filename,std::ios::binary);
    if(ifs.is_open()==false){
        printf("OPEN %s FILE FAILED!!",filename.c_str());
        return false;
    }
    size_t fsize =0;
    ifs.seekg(0,ifs.end);
    fsize=ifs.tellg();
    ifs.seekg(0,ifs.beg);
    buf->resize(fsize);
    ifs.read(&(*buf)[0],fsize);
    if(ifs.good() == false){
        printf("READ %s FILE FATLED!!",filename.c_str());
        ifs.close();
        return false;
    }
    ifs.close();
    return true;
}

//向文件写入数据
static bool WriteFile(const std::string &filename,const std::string &buf){
    std::ofstream ofs(filename,std::ios::binary|std::ios::trunc);
    if(ofs.is_open()==false){
        printf("OPEN %s FILE FAILED!!",filename.c_str());
        return false;
    }
    ofs.write(buf.c_str(),buf.size());
    if(ofs.good() == false){
        ERR_LOG("WRITE %s FILE FATLED!!",filename.c_str());
        ofs.close();
        return false;
    }
    ofs.close();
    return true;
}
//判断一个文件是否是一个目录
static bool IsDirectory(const std::string &filename){
    struct stat st;
    int ret= stat(filename.c_str(),&st);
    if(ret<0){
        return false;
    }
    return S_ISDIR(st.st_mode);
}
//判断一个文件是否是一个普通文件
static bool IsRegular(const std::string &filename){
    struct stat st;
    int ret=stat(filename.c_str(),&st);
    if(ret <0){
        return false;
    }
    return S_ISREG(st.st_mode);
}
int main()
{
    std::cout<< IsRegular("regex.cpp")<<std::endl;
    std::cout<< IsRegular("testdir")<<std::endl;
    std::cout<< IsDirectory("regex.cpp")<<std::endl;
    std::cout<< IsDirectory("testdir")<<std::endl;
    // std::string str="+";
    // std::string res;
    // for(auto &c:str){
    //     char tmp[4]={0};
    //     snprintf(tmp,4,"%%%2X",c);
    //     std::cout<<tmp<<std::endl;
    // }
    // std::string buf;
    // bool ret = ReadFile("./timerfd.cpp",&buf);
    // if(ret==false){
    //     return false;
    // }
    // ret =WriteFile("./ttttttt.c",buf);
    // if(ret == false){
    //     return false;
    // }
    // std::cout<< buf.ReadPosition() <<std::endl;
    // std::string str="abc,,,bcd,def,";
    // std::vector<std::string> arry;
    // Split(str,",",&arry);
    // for(auto &s:arry){
    //     std::cout<<"["<<s<<"]\n";
    // }
    return 0;
}